package test.base;

import org.apache.log4j.Logger;
import org.springframework.test.AbstractTransactionalDataSourceSpringContextTests;

/**
 * 用于测试 Spring 配置文件 hibernate 配置文件 以及Service的逻辑真确性
 * 
 * @author asus
 * 
 *         注： 1.继承此类后只需写测试用例，需要配置文件中的bean时直接写 protected type beanName;
 *         spring容器将能直接能给beanName赋值。 2.当子类涉及到对数据库的操作时可直接用 this.jdbcTemplate
 *         用于操作。
 * 
 */
public class BaseServiceTester extends
		AbstractTransactionalDataSourceSpringContextTests {
	protected final Logger log = Logger.getLogger(this.getClass());

	/**
	 * 空构造
	 */
	public BaseServiceTester() {

	}

	/**
	 * 构造函数 用于将来的效率测试、负载测试 （必须） 里面传需测试的方法名
	 * 
	 * @param name
	 */
	public BaseServiceTester(String name) {
		super(name);
	}

	/**
	 * 指定加载的XML文件
	 * 
	 * @see org.springframework.test.AbstractDependencyInjectionSpringContextTests#getConfigLocations()
	 */
	@Override
	protected String[] getConfigLocations() {
		// 设置在spring中按特定的方式查找bean(按名字匹配的方式进行自动装配)
		setAutowireMode(AUTOWIRE_BY_NAME);

		// 设置默认事务(默认设置true 即：不提交事务) 当设置为false测试完成且成功则自动committed
		setDefaultRollback(false);

		// 设置属性依赖性检查(当为false时,告知不进行属性依赖性检查)
		setDependencyCheck(false);

		// 启用直接对属性变量进行注入
		/**
		 * 将属性声明为protected后并通过setPopulateProtectedVariables(true)
		 * 启用对属性变量直接注入的机制（启用反射机制注入）， 就可以避免为属性变量编写对应的Setter方法了
		 */
		setPopulateProtectedVariables(true);

		return new String[] { "classpath*:test/applicationContext-*.xml" };
	}
}
